/**
 * 提取HTML中的纯文本
 * @param {string} html      HTML内容
 * @param {number} maxLength 最大字数
 * @returns {string}         纯文本
 * 
 * 作者: 肥猫BOY
 */

export default function extractPlainText(html, maxLength) {
  if (!html) return ''
  // 移除所有HTML标签
  let text = html.replace(/<\/?[^>]+(>|$)/g, '')
  // 处理常见HTML实体
  const htmlEntities = {
    '&nbsp;': ' ',
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
    '&quot;': '"',
    '&#39;': "'",
    '&#x27;': "'",
    '&#x2F;': '/',
    '&#8217;': "'",
    '&#8216;': "'",
    '&#8220;': '"',
    '&#8221;': '"',
    '&#8230;': '...',
    '&hellip;': '...',
  }
  // 替换HTML实体
  Object.keys(htmlEntities).forEach(entity => {
    const regex = new RegExp(entity, 'g')
    text = text.replace(regex, htmlEntities[entity])
  })
  // 处理数字实体（如 &#123;）
  text = text.replace(/&#(\d+);/g, (match, dec) => {
    return String.fromCharCode(dec)
  })
  // 处理十六进制实体（如 &#x20;）
  text = text.replace(/&#x([0-9A-F]+);/gi, (match, hex) => {
    return String.fromCharCode(parseInt(hex, 16))
  })
  // 清理多余空白字符
  text = text
    .replace(/\s+/g, ' ')      // 多个空格合并为一个
    .replace(/[\r\n]+/g, '\n') // 规范换行
    .trim()

  // 最大长度限制
  if (maxLength > 0) {
    text = text.substring(0, maxLength) + '...'
  }
  return text
}